package com.baselibrary.libs.design_mode.Observable_demo.Observer;

import com.baselibrary.libs.Utils.log.LogUtils;
import com.baselibrary.libs.Utils.netUtils.NoHttp.queue.Request_netWork;
import com.baselibrary.libs.Utils.netUtils.NoHttp.queue.Request_netWork_error;

import java.util.Observable;
import java.util.Observer;

/**
 * Created by Administrator 于萌萌
 * 创建日期: 15:39 . 2017年02月24日
 * 描述:
 * <p>
 * <p>
 * 备注:
 */

public abstract class BaseObserver<T> implements Observer {

    private final int  SUCCEED = 0xff1;
    private final int UPDATA = 0xff2;
    private final int FAILURE = 0xff3;
    private final int START = 0xff4;

   public interface CallBack<T>{
        void succeed(T t);
        void updata(int updata);
        void failure(Request_netWork_error o);
        void start(Request_netWork observable,T t);
    }
    CallBack mBack ;

    public BaseObserver(Observable data, CallBack callBack) {
        mBack = callBack;
        data.addObserver(this);
    }

    @Override
    public void update(Observable observable, Object data) {
        LogUtils.i("观察者设计模式 观察者 取货 "+data);
        switch ((int)data){
            case SUCCEED:
                LogUtils.i("观察者设计模式 观察者 成功 "+observable);
                if (observable instanceof Request_netWork){

                    mBack.succeed(getBean(observable));
                }
            break;
            case UPDATA:
                LogUtils.i("观察者设计模式 观察者 进度 "+observable);
                if (observable instanceof Request_netWork){

                    mBack.updata(((Request_netWork) observable).getUpData());
                }
            break;
            case FAILURE:
                LogUtils.i("观察者设计模式 观察者 失败 "+observable);
                if (observable instanceof Request_netWork){

                    mBack.failure(((Request_netWork) observable).getError());
                }
            break;
            case START:
                LogUtils.i("观察者设计模式 观察者 开始 "+observable);
                if (observable instanceof Request_netWork){

                    mBack.start((Request_netWork)observable,getCache(observable));
                }
            break;
        }



    }

    public abstract T getBean(Observable observable);
    public abstract T getCache(Observable observable);



}
